<?php
 /* Test d'ecriture dans un repertoire
 * @param string $repertoire Chemin d'acces au repertoire a tester
 */
 Function test_ecriture_rep ($repertoire)
  {
   $ok = 0 ;
   If ($fiche = @FOpen ($repertoire."/essai.php", "w"))
    {
     @FPuts ($fiche, "<?php \$ok=1 ; ?>") ;
     @FClose ($fiche) ;
     @Include ($repertoire."/essai.php") ;
     @UnLink ($repertoire."/essai.php") ;
    }
   Return $ok  ;
  }
 
 /**
 * Fonction de verification que le repertoire existe avaec message d'erreur
 * @param string $nom Nom du repertoire
 * @param string $rne Numero RNE etablissement
 * @param string $millesime Annee
 */
 Function verif_repertoire ($nom,$rne,$millesime)
  {
   Global $repertoire_racine ;
   //$millesime = millesime (0) ;
   //$numero_rne = retrouve_rne ($millesime)."/" ;
   $rep = retrouve_variable ($nom) ;
   If (test_ecriture_rep ($repertoire_racine.$rep) == 0) { message ("Impossible&nbsp;d'&eacute;crire&nbsp;dans&nbsp;le&nbsp;r&eacute;pertoire&nbsp;".$repertoire_racine.$rep."&nbsp;!") ; }
   Else
    {
     @MkDir ($repertoire_racine.$rep.$rne) ;
     If (test_ecriture_rep ($repertoire_racine.$rep.$rne) == 0) { message ("Impossible&nbsp;d'&eacute;crire&nbsp;dans&nbsp;le&nbsp;r&eacute;pertoire&nbsp;".$repertoire_racine.$rep.$rne."&nbsp;!") ; }
    }
  }
 
 /* Retrouve la valeur d'une variable dans la bdd
 * @param string $nom Nom de la variable dans la table tromb_parametres
 */
 Function retrouve_variable ($nom)
  {
   Global $id_sql ;
   $res = SQL_commande ("SELECT valeur FROM tromb_parametres WHERE nom_variable='".$nom."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1) { $v = SQL_ligne_suivante ($res) ; } Else { $v [0] = "" ; }
   Return $v [0] ;
  }

 /* Ecrit la valeur d'une variable dans la bdd
 * @param string $nom Nom de la variable dans la table tromb_parametres
 * @param string $valeur Valeur de la variable
 * @param string $description Description succinte de la variable (a quoi elle sert)
 */
 Function ecrit_variable ($nom, $valeur, $description)
  {
   Global $id_sql ;
   $ok = 0 ;
   If ($description == "") { $description = "Variable systeme." ; }
   $res = SQL_commande ("SELECT id_tromb_parametre FROM tromb_parametres WHERE nom_variable='".$nom."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1)
    {
     // Existe
     $v = SQL_ligne_suivante ($res) ;
     $res = SQL_commande ("UPDATE tromb_parametres SET valeur='".$valeur."',nom='".$description."' WHERE id_tromb_parametre='".$v [0]."' LIMIT 1", $id_sql) ;
     $ok = 1 ;
    }
   Else
    {
     // N'existe pas -> insertion
     $res = SQL_commande ("INSERT INTO tromb_parametres (nom,nom_variable,id_tromb_type_parametre,valeur) VALUES ('".$description."','".$nom."','0','".$valeur."')", $id_sql) ;
     $ok = 2 ;
    }
   Return $ok ;
  }

 /* Renvoi l'heure UNIX
 * @param string $dt Date
 * @param string $hr Heure
 */
 Function heure_unix ($dt, $hr)
  {
   $d = Explode ("-", $dt) ;
   $h = Explode (":", $hr) ;
   $unix_heure = MkTime ((integer)$h [0],(integer)$h [1],(integer)$h [2],(integer)$d [1],(integer)$d [2],(integer)$d [0]) ;
   Return (integer)$unix_heure ;
  }

 /* Initialise le tableau des jours de passages
 * @param int $type Type de traitement (0=eleves ; 1=utilisateurs)
 * @return array Tableau contenant les tranches de passage
 *               [0][0] = Nombre de plages total
 *               [i][0] = 1:Matin|2:Apres-midi
 *               [i][1] = Heure debut
 *               [i][2] = Heure fin
 *               [i][3] = Heure pause debut
 *               [i][4] = Heure pause fin
 *               [i][5] = Date
 */
 Function jours_de_passage ($type)
  {
   Global $id_sql ;
   $passage = SQL_commande ("SELECT * FROM tromb_jours_passage WHERE type='".$type."' ORDER BY date", $id_sql) ;
   $jp [0][0] = 0 ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($passage) ; $i++)
    {
     $p = SQL_tableau_associatif ($passage, "") ;
     If (($p ["heure_matin_debut"] != $p ["heure_matin_fin"]) Or ($p ["heure_apres_midi_debut"] != $p ["heure_apres_midi_fin"]))
      {
       If ($p ["heure_matin_debut"] != $p ["heure_matin_fin"])
        {
	     $jp [0][0]++ ;
         $jp [$jp [0][0]][0] = 1 ; // Matin
	     $jp [$jp [0][0]][1] = heure_unix ($p ["date"], $p ["heure_matin_debut"]) ; // Debut
         $jp [$jp [0][0]][2] = heure_unix ($p ["date"], $p ["heure_matin_fin"]) ; // Fin
	     If ($p ["heure_pause_matin_debut"] != $p ["heure_pause_matin_fin"])
          {
           $jp [$jp [0][0]][3] = heure_unix ($p ["date"], $p ["heure_pause_matin_debut"]) ; // Debut
           $jp [$jp [0][0]][4] = heure_unix ($p ["date"], $p ["heure_pause_matin_fin"]) ; // Fin
          }
         Else
          {
           $jp [$jp [0][0]][3] = heure_unix ($p ["date"], $p ["heure_pause_matin_fin"]) ; // Debut
           $jp [$jp [0][0]][4] = heure_unix ($p ["date"], $p ["heure_pause_matin_fin"]) ; // Fin
          }
	     $jp [$jp [0][0]][5] = $p ["date"] ; // Date
	    }
       If ($p ["heure_apres_midi_debut"] != $p ["heure_apres_midi_fin"])
        {
	     $jp [0][0]++ ;
         $jp [$jp [0][0]][0] = 2 ; // Apres midi
	     $jp [$jp [0][0]][1] = heure_unix ($p ["date"], $p ["heure_apres_midi_debut"]) ; // Debut
         $jp [$jp [0][0]][2] = heure_unix ($p ["date"], $p ["heure_apres_midi_fin"]) ; // Fin
	     If ($p ["heure_pause_matin_debut"] != $p ["heure_pause_apres_midi_fin"])
          {
           $jp [$jp [0][0]][3] = heure_unix ($p ["date"], $p ["heure_pause_apres_midi_debut"]) ; // Debut
           $jp [$jp [0][0]][4] = heure_unix ($p ["date"], $p ["heure_pause_apres_midi_fin"]) ; // Fin
          }
         Else
          {
           $jp [$jp [0][0]][3] = heure_unix ($p ["date"], $p ["heure_pause_apres_midi_fin"]) ; // Debut
           $jp [$jp [0][0]][4] = heure_unix ($p ["date"], $p ["heure_pause_apres_midi_fin"]) ; // Fin
          }
	     $jp [$jp [0][0]][5] = $p ["date"] ; // Date
	    }
      }
    }
   Return $jp ;
  }
 
 /* Calcul des jours et heures de passage
 * @param int $type Type de traitement (0=eleves ; 1=utilisateurs)
 */
 Function jours_heures_passage ($type)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   $annee_reference = 1970 ;
   $coeff_securite = 2 ;
   If (($type < 0) Or ($type > 1)) { Return -2 ; }
   
   $erreur = 0 ;
   // Determine l'ensemble des jours et heures de passage
   $jours_passage = jours_de_passage ($type) ;
   
   If ($jours_passage [0][0] > 0)
    {
     $numero = 1 ;
     $matin = $jours_passage [1][0] ;
     $debut = $jours_passage [1][1] ;
     $fin = $jours_passage [1][2] ;
     $debut_pause = $jours_passage [1][3] ;
     $fin_pause = $jours_passage [1][4] ;
     
     $i = 0 ;
     $categories = SQL_commande ("SELECT * FROM tromb_passages WHERE type='".$type."' ORDER BY numero", $id_sql) ;
     $nombre_categories = SQL_nbr_lignes ($categories) ;
     $categorie = SQL_tableau_associatif ($categories, "") ;
     
     If ($type == 0)
      {
       // Traitement des eleves
       
       // Mise a jour des noms des photos
       // Efface les eleves du trombinoscope
       $ok = SQL_commande ("DELETE FROM tromb_utilisateurs WHERE type='".$type."'", $id_sql) ;
       // Efface les noms des photos
       $ok = SQL_commande ("UPDATE eleves SET photo='' WHERE exterieur='0' AND millesime='".$millesime."'", $id_sql) ;
       
       // Fabrication des zeros
       $nombre_chiffres_originale = retrouve_variable ("nombre_chiffres_originale") ;
       $nombre_chiffres_traitee = retrouve_variable ("nombre_chiffres_traitee") ;
       $zero_originale = Str_Repeat ("0", $nombre_chiffres_originale) ;
       $zero_traitee = Str_Repeat ("0", $nombre_chiffres_traitee) ;
       
       // Recherche des parametres de la photo originale
       $nom_generique_originale = retrouve_variable ("nom_generique_originale") ;
       $ext_originale = retrouve_variable ("ext_originale") ;
       // Recherche des parametres de la photo traitee
       $nom_generique_traitee = retrouve_variable ("nom_generique_traitee_eleve") ;
       $ext_traitee = retrouve_variable ("ext_traitee") ;
       // Recherche du nombre de photos en plus
       $nombre_photos_vierges = retrouve_variable ("nombre_photos_vierges") ;
      
       // Recherche des classes dans l'ordre
       $res_cl = SQL_commande ("SELECT c.* FROM classes c, tromb_passages p WHERE c.id_classe=p.id AND p.type='".$type."' AND c.millesime='".$millesime."' ORDER BY p.numero,c.nom_bref,c.nom", $id_sql) ;
       $nbr_cl = SQL_nbr_lignes ($res_cl) ;
       $num_photo = 0 ;
       $requete = "" ;
       For ($i = 0 ; $i < $nbr_cl ; $i++)
        {
         $ligne_classe = SQL_tableau_associatif ($res_cl, "") ;
         // Recherche des eleves de la classe en cours
         $res_el = SQL_commande ("SELECT * FROM eleves WHERE classe='".$ligne_classe ["id_classe"]."' AND exterieur='0' AND millesime='".$millesime."' ORDER BY nom,prenoms", $id_sql) ;
         $nbr_el = SQL_nbr_lignes ($res_el) ;
         For ($j = 0 ; $j < $nbr_el ; $j++)
          {
           $ligne_el = SQL_tableau_associatif ($res_el, "") ;
  	       $num_photo++ ;
	       $numero_p = (string)$num_photo ;
	       $photo_originale = $nom_generique_originale.SubStr ($zero_originale, 0, $nombre_chiffres_originale-StrLen ($numero_p)).$numero_p.".".$ext_originale ;
	       $photo_traitee = $nom_generique_traitee.SubStr ($zero_traitee, 0, $nombre_chiffres_traitee-StrLen ($numero_p)).$numero_p.".".$ext_traitee ;
	       //$ok = SQL_commande ("INSERT INTO tromb_utilisateurs (type,id_utilisateur,id,nom,prenoms,photo_originale,photo_traitee,date,heure_debut,heure_fin,traitee,vignette,deplacee,activation)
	       //                    VALUES ('0','".$ligne_el ["id_eleve"]."','".$ligne_el ["classe"]."','".Str_Replace ("'", "\'", $ligne_el ["nom"])."','".Str_Replace ("'", "\'", $ligne_el ["prenoms"])."','".$photo_originale."','".$photo_traitee."','0000-00-00','00:00:00','00:00:00','0','0','0','0')", $id_sql) ;
	       If ($requete != "") { $requete .= "," ; }
	       $requete .= "('0','".$ligne_el ["id_eleve"]."','".$ligne_el ["classe"]."','".Str_Replace ("'", "\'", $ligne_el ["nom"])."','".Str_Replace ("'", "\'", $ligne_el ["prenoms"])."','".$photo_originale."','".$photo_traitee."','0000-00-00','00:00:00','00:00:00','0','0','0','0')" ;
          }
         For ($j = 1 ; $j <= $nombre_photos_vierges ; $j++)
          {
	       $num_photo++ ;
	       $numero_p = (string)$num_photo ;
	       $photo_originale = $nom_generique_originale.SubStr ($zero_originale, 0, $nombre_chiffres_originale-StrLen ($numero_p)).$numero_p.".".$ext_originale ;
	       $photo_traitee = $nom_generique_traitee.SubStr ($zero_traitee, 0, $nombre_chiffres_traitee-StrLen ($numero_p)).$numero_p.".".$ext_traitee ;
	       //$ok = SQL_commande ("INSERT INTO tromb_utilisateurs (type,id_utilisateur,id,nom,prenoms,photo_originale,photo_traitee,date,heure_debut,heure_fin,traitee,vignette,deplacee,activation)
	       //                     VALUES ('0','0','".$ligne_classe ["id_classe"]."','_x_','_y_','".$photo_originale."','".$photo_traitee."','0000-00-00','00:00:00','00:00:00','0','0','0','0')", $id_sql) ;
	       If ($requete != "") { $requete .= "," ; }
	       $requete .= "('0','0','".$ligne_classe ["id_classe"]."','_x".$j."_','_y".$j."_','".$photo_originale."','".$photo_traitee."','0000-00-00','00:00:00','00:00:00','0','0','0','0')" ;
          }
        }
       If ($requete != "")
        {
         $ok = SQL_commande ("INSERT INTO tromb_utilisateurs (type,id_utilisateur,id,nom,prenoms,photo_originale,photo_traitee,date,heure_debut,heure_fin,traitee,vignette,deplacee,activation) VALUES ".$requete, $id_sql) ;
        }
       
       $duree_un_eleve = retrouve_variable ("duree_eleve") ;
       $duree_intermediaire = retrouve_variable ("duree_intermediaire") ;
       $classes = SQL_commande ("SELECT COUNT(id_classe) FROM classes WHERE millesime='".$millesime."'", $id_sql) ;
       $nbr_classe = SQL_ligne_suivante ($classes) ;
       $num_plage = 1 ;
       $erreur = 0 ;
       While (($num_plage <= $jours_passage [0][0]) And ($erreur == 0))
        {
         // Calcul des numeros en fonction de la date de la plage
         $date_courante = $jours_passage [$num_plage][5] ;
         $dt = Explode ("-", $date_courante) ;
         $numero_debut = MkTime (0,0,0,$dt [1],$dt [2],$annee_reference)+$nbr_classe [0]*$jours_passage [$num_plage][0]*$coeff_securite ;
         $numero_fin = MkTime (0,0,0,$dt [1],$dt [2],$annee_reference)+$nbr_classe [0]*($jours_passage [$num_plage][0]+1)*$coeff_securite ;
         // Recherche des classes concernees
         $classes = SQL_commande ("SELECT id FROM tromb_passages WHERE type='".$type."' AND numero>='".$numero_debut."' AND numero<'".$numero_fin."' ORDER BY numero", $id_sql) ;
         $nbr_classe_plage = SQL_nbr_lignes ($classes) ;
         // On les parcours et on les classes dans l'ordre voulu
         $heure_debut = $jours_passage [$num_plage][1] ;
         $heure_fin = $jours_passage [$num_plage][2] ;
         $heure_pause_debut = $jours_passage [$num_plage][3] ;
         $heure_pause_fin = $jours_passage [$num_plage][4] ;
         $num_classe = 1 ;
         While (($num_classe <= $nbr_classe_plage) And ($erreur == 0))
          {
           $classe = SQL_ligne_suivante ($classes) ;
           $eleves = SQL_commande ("SELECT id_tromb_utilisateur FROM tromb_utilisateurs WHERE id='".$classe [0]."' AND type='".$type."' ORDER BY nom,prenoms ASC", $id_sql) ;
           $nbr_eleves = SQL_nbr_lignes ($eleves) ;
           // Calcul de la duree de passage totale en comptant les photos vierges si existent
           $duree_totale = $duree_un_eleve*$nbr_eleves ;
           // Deux choix : Pause ou pas pause
           $ok = 0 ;
           If ($jours_passage [$num_plage][3] == $jours_passage [$num_plage][4])
            {
             // Pas de pause : heure_debut+duree<heure_fin ?
             If (($heure_debut+$duree_totale <= $heure_fin)) { $ok = 1 ; } Else { $ok = 0 ; }
            }
           Else
            {
             // Pause existante : heure_debut+duree<heure_pause si heure_debut < heure_pause_debut ou heure_debut+duree<heure_fin si heure_debut>=heure_pause_fin ?
             If ((($heure_debut+$duree_totale <= $heure_pause_debut) And ($heure_debut < $heure_pause_debut)) Or
                 (($heure_debut+$duree_totale <= $heure_fin) And ($heure_debut >= $heure_pause_fin)))
              { $ok = 1 ; }
             Else
              {
               // Test apres la pause
               $heure_debut = $heure_pause_fin ;
               If (($heure_debut+$duree_totale <= $heure_fin)) { $ok = 1 ; } Else { $ok = 0 ; }
              }
            }
           // Mise a jour
           If ($ok == 1)
            {
             $requete  = "UPDATE tromb_passages SET date='".Date ("Y-m-d", $heure_debut)."',heure_debut='".Date ("H:i:s", $heure_debut)."'," ;
             $requete .= "heure_fin='".Date ("H:i:s", $heure_debut+$duree_totale)."' WHERE id='".$classe [0]."' AND type='".$type."' LIMIT 1" ;
             $ok = SQL_commande ($requete, $id_sql) ;
             For ($num_eleve = 0 ; $num_eleve < $nbr_eleves ; $num_eleve++)
	          {
	           $eleve = SQL_ligne_suivante ($eleves) ;
               $requete  = "UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $heure_debut)."',heure_debut='".Date ("H:i:s", $heure_debut+$duree_un_eleve*$num_eleve)."'," ;
               $requete .= "heure_fin='".Date ("H:i:s", $heure_debut+$duree_un_eleve*($num_eleve+1))."' WHERE id_tromb_utilisateur='".$eleve [0]."' LIMIT 1" ;
               $ok = SQL_commande ($requete, $id_sql) ;
	          }
	         // Mise a jour des heures de debut pour la classe qui suit
	         $heure_debut += $duree_totale ;
	         If ((($heure_debut < $heure_pause_debut) And ($heure_debut+$duree_intermediaire < $heure_pause_debut)) Or
	             (($heure_debut >= $heure_pause_fin) And ($heure_debut+$duree_intermediaire <= $heure_fin)))
	          { $heure_debut += $duree_intermediaire ; }
	         Else
	          {
	           If ($heure_debut < $heure_pause_debut) { $heure_debut = $heure_pause_fin ; } Else { $heure_debut = $heure_fin ; }
	          }
            }
           Else
            {
             // Traitement de l'erreur
             $erreur = $num_plage ;
            }
           $num_classe++ ;
          }
         $num_plage++ ;
        }
      }
     Else
      {
       // Traitement des utilisateurs
       $duree = retrouve_variable ("duree_utilisateur") ;
       $nombre_demi_journee = 0 ;
       
       $ordre_alpha = retrouve_variable ("passage_ordre_alphabetique") ;
       If ($ordre_alpha == 1) { $suppl = " ORDER BY nom ASC,prenoms ASC" ; }
       ElseIf ($ordre_alpha == 2) { $suppl = " ORDER BY nom DESC,prenoms DESC" ; }
       Else { $suppl = " ORDER BY nom,prenoms" ; }
       
       $ordre_jour = retrouve_variable ("passage_ordre_jour") ;
       //echo $ordre_jour."<BR>" ;
       $res = SQL_commande ("SELECT COUNT(id_tromb_utilisateur) FROM tromb_utilisateurs WHERE id='".$categorie ["id"]."' AND type='1'", $id_sql) ;
       $nbr = SQL_ligne_suivante ($res) ;
       //echo "SELECT COUNT(id_tromb_utilisateur) FROM tromb_utilisateurs WHERE id='".$categorie ["id"]."' AND type='1'->".$nbr [0]."<BR>" ;
       // Recherche la duree correspondante
       $duree_totale = $duree*$nbr [0] ;
       $debut_rel = $debut ;
       $utils = SQL_commande ("SELECT id_tromb_utilisateur FROM tromb_utilisateurs WHERE id='".$categorie ["id"]."' AND type='1'".$suppl, $id_sql) ;
       While (($i < $nombre_categories) And ($erreur == 0))
        {
	     //echo $categorie ["id"]."->".$duree_totale."=".$duree."x".$nbr [0]."->".($debut+$duree_totale)."<-".$debut."-".$debut_pause."-".$fin_pause."-".$fin."<BR>" ;
	     //echo $numero."(".$ordre_jour.")=>".$matin."-".$debut."-(".$debut_rel.")-".$debut_pause."-".$fin_pause."-".$fin."<BR>" ;
         If ($debut+$duree_totale <= $debut_pause)
          {
           $ok = SQL_commande ("UPDATE tromb_passages SET date='".Date ("Y-m-d", $debut_rel)."',heure_debut='".Date ("H:i:s", $debut_rel)."',heure_fin='".Date ("H:i:s", $debut+$duree*$nbr [0])."'
	                         WHERE id='".$categorie ["id"]."' AND type='1' LIMIT 1", $id_sql) ;
           For ($j = 0 ; $j < $nbr [0] ; $j++)
	        {
	         $u = SQL_ligne_suivante ($utils) ;
             $ok = SQL_commande ("UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	                           WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1", $id_sql) ;
             //echo "1-UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	         //                      WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1<BR>" ;
	        }
           $categorie = SQL_tableau_associatif ($categories, "") ;
           // Recherche les nombre d'utilisateurs
	       $res = SQL_commande ("SELECT COUNT(id_tromb_utilisateur) FROM tromb_utilisateurs WHERE id='".$categorie ["id"]."' AND type='1'", $id_sql) ;
           $nbr = SQL_ligne_suivante ($res) ;
           
           $i++ ;
	       $utils = SQL_commande ("SELECT id_tromb_utilisateur FROM tromb_utilisateurs WHERE id='".$categorie ["id"]."' AND type='1'".$suppl, $id_sql) ;
	       If ($ordre_jour == 1)
	        {
             $debut += $duree_totale ;
             If ($debut > $debut_pause) { $debut = $fin_pause ; }
	         $debut_rel = $debut ;
            }
	       ElseIf ($ordre_jour == 2)
	        {
	         $numero++ ;
	         If ($numero > $jours_passage [0][0]) { $erreur = $nombre_categories-$i ; }
	         Else
	          {
	           $matin = $jours_passage [$numero][0] ;
               $debut_rel = $debut = $jours_passage [$numero][1] ;
               $fin = $jours_passage [$numero][2] ;
               $debut_pause = $jours_passage [$numero][3] ;
               $fin_pause = $jours_passage [$numero][4] ;
	      }
	    }
	   Else
	    {
	     $dt_courante = $jours_passage [$numero][5] ;
	     While (($dt_courante == $jours_passage [$numero][5]) And ($erreur == 0))
	      {
	       $numero++ ;
	       If ($numero > $jours_passage [0][0]) { $erreur = $nombre_categories-$i ; }
              }
             If ($erreur == 0)
	      {
	       $matin = $jours_passage [$numero][0] ;
               $debut_rel = $debut = $jours_passage [$numero][1] ;
               $fin = $jours_passage [$numero][2] ;
               $debut_pause = $jours_passage [$numero][3] ;
               $fin_pause = $jours_passage [$numero][4] ;
	      }
	    }
	   // Recherche la duree correspondante
           $duree_totale = $duree*$nbr [0] ;
          }
         Else
          {
           If ($debut <= $debut_pause)
	    {
	     // Calcul le nombre possible
	     $nbr_possible = Floor (($debut_pause-$debut)/$duree) ;
	     //echo "2-Possible=".$nbr_possible."<BR>" ;
	     For ($j = 0 ; $j < $nbr_possible ; $j++)
	      {
	       $u = SQL_ligne_suivante ($utils) ;
               $ok = SQL_commande ("UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	                             WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1", $id_sql) ;
               //echo "2-UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	       //                      WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1<BR>" ;
	      }
	     $nbr [0] = $nbr [0]-$nbr_possible ;
	     $duree_totale = $duree*$nbr [0] ;
	     $debut = $fin_pause ;
	    }
           If ($debut+$duree_totale <= $fin)
            {
             $ok = SQL_commande ("UPDATE tromb_passages SET date='".Date ("Y-m-d", $debut_rel)."',heure_debut='".Date ("H:i:s", $debut_rel)."',heure_fin='".Date ("H:i:s", $debut+$duree*$nbr [0])."'
                                   WHERE id='".$categorie ["id"]."' AND type='1' LIMIT 1", $id_sql) ;
             For ($j = 0 ; $j < $nbr [0] ; $j++)
	      {
	       $u = SQL_ligne_suivante ($utils) ;
               $ok = SQL_commande ("UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	                             WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1", $id_sql) ;

               //echo "3-UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	       //                      WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1<BR>" ;
	      }
             $categorie = SQL_tableau_associatif ($categories, "") ;
             // Recherche les nombre d'utilisateurs
	     $res = SQL_commande ("SELECT COUNT(id_tromb_utilisateur) FROM tromb_utilisateurs WHERE id='".$categorie ["id"]."' AND type='1'", $id_sql) ;
             $nbr = SQL_ligne_suivante ($res) ;
             $i++ ;
	     $utils = SQL_commande ("SELECT id_tromb_utilisateur FROM tromb_utilisateurs WHERE id='".$categorie ["id"]."' AND type='1'".$suppl, $id_sql) ;
	     If ($ordre_jour == 1)
	      {
	       $debut_rel = $debut += $duree_totale ;
              }
	     ElseIf ($ordre_jour == 2)
	      {
	       $numero++ ;
	       If ($numero > $jours_passage [0][0]) { $erreur = $nombre_categories-$i ; }
	       Else
	        {
	         $matin = $jours_passage [$numero][0] ;
                 $debut_rel = $debut = $jours_passage [$numero][1] ;
                 $fin = $jours_passage [$numero][2] ;
                 $debut_pause = $jours_passage [$numero][3] ;
                 $fin_pause = $jours_passage [$numero][4] ;
	        }
	      }
             Else
	      {
	       $dt_courante = $jours_passage [$numero][5] ;
	       While (($dt_courante == $jours_passage [$numero][5]) And ($erreur == 0))
	        {
	         $numero++ ;
	         If ($numero > $jours_passage [0][0]) { $erreur = $nombre_categories-$i ; }
                }
               If ($erreur == 0)
	        {
	         $matin = $jours_passage [$numero][0] ;
                 $debut_rel = $debut = $jours_passage [$numero][1] ;
                 $fin = $jours_passage [$numero][2] ;
                 $debut_pause = $jours_passage [$numero][3] ;
                 $fin_pause = $jours_passage [$numero][4] ;
	        }
	      }
	     // Recherche la duree correspondante
             $duree_totale = $duree*$nbr [0] ;
            }
           Else
            {
	     // Calcul le nombre possible
	     $nbr_possible = Floor (($fin-$debut)/$duree) ;
	     //echo "4-Possible=".$nbr_possible."<BR>" ;
	     For ($j = 0 ; $j < $nbr_possible ; $j++)
	      {
	       $u = SQL_ligne_suivante ($utils) ;
               $ok = SQL_commande ("UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	                             WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1", $id_sql) ;
               //echo "4-UPDATE tromb_utilisateurs SET date='".Date ("Y-m-d", $debut)."',heure_debut='".Date ("H:i:s", $debut+$duree*$j)."',heure_fin='".Date ("H:i:s", $debut+$duree*($j+1))."'
	       //                      WHERE id_tromb_utilisateur='".$u [0]."' LIMIT 1<BR>" ;
	      }
	     $nbr [0] = $nbr [0]-$nbr_possible ;
	     If ($ordre_jour == 3)
	      {
	       $dt_courante = $jours_passage [$numero][5] ;
	       While (($dt_courante == $jours_passage [$numero][5]) And ($erreur == 0))
	        {
	         $numero++ ;
	         If ($numero > $jours_passage [0][0]) { $erreur = $nombre_categories-$i ; }
                }
               If ($erreur == 0)
	        {
	         $matin = $jours_passage [$numero][0] ;
                 $debut_rel = $debut = $jours_passage [$numero][1] ;
                 $fin = $jours_passage [$numero][2] ;
                 $debut_pause = $jours_passage [$numero][3] ;
                 $fin_pause = $jours_passage [$numero][4] ;
	        }
	      }
	     Else
	      {
	       $numero++ ;
	       If ($numero > $jours_passage [0][0]) { $erreur = $nbr [0] ; }
	       Else
	        {
	         $matin = $jours_passage [$numero][0] ;
                 $debut = $jours_passage [$numero][1] ;
                 $fin = $jours_passage [$numero][2] ;
                 $debut_pause = $jours_passage [$numero][3] ;
                 $fin_pause = $jours_passage [$numero][4] ;
                }
	      }
	     $duree_totale = $duree*$nbr [0] ;
	    }
          }
        }
      }
    }
   Else
    {
     // Pas une seule journee initialisee
     $erreur = -1 ;
    }
   Return $erreur ;
  }

 /* Creation du tableau HTML des passages des classes
 * 
 */
 Function tableau_passage_classes ($alignement, $couleur_fond, $couleur_bord, $couleur_entete, $couleur_impaire, $taille_caractere)
  {
   Global $id_sql, $nom_mois ;
   $resultat = SQL_commande ("SELECT * FROM tromb_jours_passage WHERE type='0' ORDER BY date,heure_matin_debut,heure_apres_midi_debut", $id_sql) ;
   If (SQL_nbr_lignes ($resultat))
    {
     $max_matin = 0 ;
     $max_apres_midi = 0 ;
     $ligne1 = "" ;
     $ligne2 = "" ;
     $ligne3 = "" ;
     For ($i = 0 ; $i < SQL_nbr_lignes ($resultat) ; $i++)
      {
       $ligne = SQL_tableau_associatif ($resultat, "") ;
       $d = Explode ("-", $ligne ["date"]) ;
       $ligne1 .= "<TD ALIGN=\"CENTER\">&nbsp;<FONT SIZE=\"".$taille_caractere."\"><B>".$d [2]."&nbsp;".$nom_mois [(integer)$d [1]]."&nbsp;".$d [0]."</B></FONT>&nbsp;</TD>\n" ;
       If ($i < SQL_nbr_lignes ($resultat)-1) { $ligne1 .= "<TD WIDTH=\"1\" BGCOLOR=\"".$couleur_bord."\"></TD>\n" ; }
       
       If ($ligne ["heure_matin_debut"] != $ligne ["heure_matin_fin"])
        {
         $res = SQL_commande ("SELECT t.numero,t.heure_debut,t.heure_fin,c.nom,c.nom_bref,COUNT(e.id_eleve) AS nombre
                                 FROM tromb_passages t,classes c,eleves e
			        WHERE t.date='".$ligne ["date"]."' AND t.heure_debut>='".$ligne ["heure_matin_debut"]."'
			          AND t.heure_fin<='".$ligne ["heure_matin_fin"]."' AND t.id=c.id_classe AND t.id=e.classe
			     GROUP BY e.classe
			     ORDER BY t.numero", $id_sql) ;
         $nombre = SQL_nbr_lignes ($res) ;
         If ($nombre > 0)
          {
	   If ($nombre > $max_matin) { $max_matin = $nombre ; }
           $ligne2 .= "<TD vALIGN=\"TOP\"><TABLE BORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"0\" BGCOLOR=\"".$couleur_fond."\" STYLE=\"BORDER:1px ".$couleur_bord." solid;border-collapse:collapse\" WIDTH=\"100%\">" ;
           $ligne2 .= "<TR BGCOLOR=\"".$couleur_entete."\">" ;
	   $ligne2 .= "<TD ALIGN=\"CENTER\">&nbsp;<FONT SIZE=\"".$taille_caractere."\">Classe</FONT>&nbsp;</TD>" ;
           $ligne2 .= "<TD ALIGN=\"CENTER\">&nbsp;<FONT SIZE=\"".$taille_caractere."\">Heure&nbsp;d&eacute;but</FONT>&nbsp;</TD>" ;
	   $ligne2 .= "<TD ALIGN=\"CENTER\">&nbsp;<FONT SIZE=\"".$taille_caractere."\">Heure&nbsp;fin</FONT>&nbsp;</TD>" ;
	   $ligne2 .= "</TR>" ;
           For ($j = 0 ; $j < $nombre ; $j++)
            {
  	     $k = SQL_tableau_associatif ($res, "") ;
  	     $hd = Explode (":", $k ["heure_debut"]) ;
	     $hf = Explode (":", $k ["heure_fin"]) ;
	     $ligne2 .= "<TR" ;
	     If ($j%2) { $ligne2 .= " BGCOLOR=\"".$couleur_impaire."\"" ; }
	     $ligne2 .= ">" ;
	     $ligne2 .= "<TD><FONT SIZE=\"".$taille_caractere."\"><B>".Str_Replace (" ", "&nbsp;", $k ["nom_bref"])."</B>&nbsp;<I>".Str_Replace (" ", "&nbsp;", $k ["nom"])."</I>&nbsp;(".$k ["nombre"].")&nbsp;</FONT></TD>" ;
	     $ligne2 .= "<TD ALIGN=\"CENTER\"><FONT SIZE=\"".$taille_caractere."\">&nbsp;".$hd [0]."H".$hd [1]."&nbsp;</FONT></TD>" ;
	     $ligne2 .= "<TD ALIGN=\"CENTER\"><FONT SIZE=\"".$taille_caractere."\">&nbsp;".$hf [0]."H".$hf [1]."&nbsp;</FONT></TD>" ;
	     $ligne2 .= "</TR>" ;
	    }
           $ligne2 .= "</TABLE></TD>\n" ;
          }
         Else { $ligne2 .= "<TD></TD>\n" ; }
        }
       Else { $ligne2 .= "<TD></TD>\n" ; }
       If ($i < SQL_nbr_lignes ($resultat)-1) { $ligne2 .= "<TD></TD>\n" ; }
       
       If ($ligne ["heure_apres_midi_debut"] != $ligne ["heure_apres_midi_fin"])
        {
         $res = SQL_commande ("SELECT t.numero,t.heure_debut,t.heure_fin,c.nom,c.nom_bref,COUNT(e.id_eleve) AS nombre
                                 FROM tromb_passages t,classes c,eleves e
			        WHERE t.date='".$ligne ["date"]."' AND t.heure_debut>='".$ligne ["heure_apres_midi_debut"]."'
			          AND t.heure_fin<='".$ligne ["heure_apres_midi_fin"]."' AND t.id=c.id_classe AND t.id=e.classe
			     GROUP BY e.classe
			     ORDER BY t.numero", $id_sql) ;
         $nombre = SQL_nbr_lignes ($res) ;
         If ($nombre > 0)
          {
	   If ($nombre > $max_apres_midi) { $max_apres_midi = $nombre ; }
           $ligne3 .= "<TD vALIGN=\"TOP\"><TABLE BORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"0\" BGCOLOR=\"".$couleur_fond."\" STYLE=\"BORDER:1px ".$couleur_bord." solid;border-collapse:collapse\" WIDTH=\"100%\">" ;
           $ligne3 .= "<TR BGCOLOR=\"".$couleur_entete."\">" ;
	   $ligne3 .= "<TD ALIGN=\"CENTER\">&nbsp;<FONT SIZE=\"".$taille_caractere."\">Classe</FONT>&nbsp;</TD>" ;
           $ligne3 .= "<TD ALIGN=\"CENTER\">&nbsp;<FONT SIZE=\"".$taille_caractere."\">Heure&nbsp;d&eacute;but</FONT>&nbsp;</TD>" ;
	   $ligne3 .= "<TD ALIGN=\"CENTER\">&nbsp;<FONT SIZE=\"".$taille_caractere."\">Heure&nbsp;fin</FONT>&nbsp;</TD>" ;
	   $ligne3 .= "</TR>" ;
           For ($j = 0 ; $j < $nombre ; $j++)
            {
	     $k = SQL_tableau_associatif ($res, "") ;
	     $hd = Explode (":", $k ["heure_debut"]) ;
	     $hf = Explode (":", $k ["heure_fin"]) ;
	     $ligne3 .= "<TR" ;
	     If ($j%2) { $ligne3 .= " BGCOLOR=\"".$couleur_impaire."\"" ; }
	     $ligne3 .= ">" ;
	     $ligne3 .= "<TD><FONT SIZE=\"".$taille_caractere."\"><B>".Str_Replace (" ", "&nbsp;", $k ["nom_bref"])."</B>&nbsp;<I>".Str_Replace (" ", "&nbsp;", $k ["nom"])."</I>&nbsp;(".$k ["nombre"].")&nbsp;</FONT></TD>" ;
	     $ligne3 .= "<TD ALIGN=\"CENTER\"><FONT SIZE=\"".$taille_caractere."\">&nbsp;".$hd [0]."H".$hd [1]."&nbsp;</FONT></TD>" ;
	     $ligne3 .= "<TD ALIGN=\"CENTER\"><FONT SIZE=\"".$taille_caractere."\">&nbsp;".$hf [0]."H".$hf [1]."&nbsp;</FONT></TD>" ;
	     $ligne3 .= "</TR>" ;
	    }
           $ligne3 .= "</TABLE></TD>\n" ;
          }
         Else { $ligne3 .= "<TD></TD>\n" ; }
        }
       Else { $ligne3 .= "<TD></TD>\n" ; }
       If ($i < SQL_nbr_lignes ($resultat)-1) { $ligne3 .= "<TD></TD>\n" ; }
      }
     //Echo "<A HREF=\"javascript:window.print()\"><IMG SRC=\"../images/imprimante.png\" BORDER=\"0\" vALIGN=\"BOTTOM\"></A>" ;
     $ligne = "<TABLE ALIGN=\"".$alignement."\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\" BGCOLOR=\"".$couleur_fond."\" STYLE=\"border:1px solid ".$couleur_bord.";border-collapse:collapse\">\n" ;
     $ligne .= "<TR BGCOLOR=\"".$couleur_entete."\"><TD COLSPAN=\"".(2*SQL_nbr_lignes ($resultat)-1)."\" ALIGN=\"CENTER\">&nbsp;Tableau&nbsp;de&nbsp;passages&nbsp;des&nbsp;&eacute;l&egrave;ves.&nbsp;</TD></TR>\n" ;
     $ligne .= "<TR BGCOLOR=\"".$couleur_entete."\">".$ligne1."</TR>\n" ;
     $ligne .= "<TR>".$ligne2."</TR>\n" ;
     $ligne .= "<TR><TD HEIGHT=\"1\" COLSPAN=\"".(2*SQL_nbr_lignes ($resultat)-1)."\"></TD></TR>\n" ;
     $ligne .= "<TR>".$ligne3."</TR>\n" ;
     $ligne .= "</TABLE>" ;
    }
   Else { $ligne = "" ; }
   Return $ligne ;
  }
 
 /**
 * Function de mise a jour de la base eleve et utilisateurs pour le trombinoscope
 */
 Function mise_a_jour_base ()
  {
   Global $id_sql ;
   // Mise a jour de la liste des eleves
   $resultats = SQL_commande ("SELECT DISTINCT e.id_eleve FROM eleves e,tromb_utilisateurs u WHERE u.id_utilisateur!='0' AND u.id_utilisateur=e.id_eleve and u.type='0'", $id_sql) ;
   $nbr = SQL_nbr_lignes ($resultats) ;
   If ($nbr > 0)
    {
     $requete = "SELECT * FROM eleves WHERE exterieur='0' AND millesime='".millesime (0)."' AND " ;
     For ($i = 0 ; $i < $nbr ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultats) ;
       If ($i > 0) { $requete .= "AND " ; }
       $requete .= "id_eleve!='".$ligne [0]."' " ;
      }
     $resultats = SQL_commande ($requete, $id_sql) ;
     $nbr = SQL_nbr_lignes ($resultats) ;
     If ($nbr > 0)
      {
       $requete = "INSERT INTO tromb_utilisateurs (type,id_utilisateur,id,nom,prenoms,photo_originale,photo_traitee,date,heure_debut,heure_fin,traitee,vignette,deplacee,activation) VALUES " ;
       For ($i = 0 ; $i < $nbr ; $i++)
        {
         $ligne = SQL_tableau_associatif ($resultats) ;
         If ($i > 0) { $requete .= "," ; }
         $requete .= "('0','".$ligne ["id_eleve"]."','".$ligne ["classe"]."','".Str_Replace ("'", "\'", $ligne ["nom"])."','".Str_Replace ("'", "\'", $ligne ["prenoms"])."','','".$ligne ["photo"]."','0000-00-00','00:00:00','00:00:00','0','0','0','0')" ;
        }
       $resultats = SQL_commande ($requete, $id_sql) ;
      }
    }
   // Mise a jour des noms de photos eleves
   $resultats = SQL_commande ("SELECT e.id_eleve,e.photo FROM eleves e,tromb_utilisateurs u WHERE u.id_utilisateur!='0' AND u.id_utilisateur=e.id_eleve and u.type='0' AND u.photo_traitee!=e.photo", $id_sql) ;
   $nbr = SQL_nbr_lignes ($resultats) ;
   If ($nbr > 0)
    {
     For ($i = 0 ; $i < $nbr ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultats) ;
       $ok = SQL_commande ("UPDATE tromb_utilisateurs SET photo_traitee='".$ligne [1]."' WHERE id_utilisateur='".$ligne [0]."' AND type='0' LIMIT 1", $id_sql) ;
      }
    }
   // Mise a jour de la liste des profs
   $resultats = SQL_commande ("SELECT DISTINCT e.id_utilisateur FROM utilisateurs e,tromb_utilisateurs u WHERE u.id_utilisateur!='0' AND u.id_utilisateur=e.id_utilisateur and u.type='1'", $id_sql) ;
   $nbr = SQL_nbr_lignes ($resultats) ;
   If ($nbr > 0)
    {
     $requete = "SELECT * FROM utilisateurs WHERE millesime='".millesime (0)."' AND " ;
     For ($i = 0 ; $i < $nbr ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultats) ;
       If ($i > 0) { $requete .= "AND " ; }
       $requete .= "id_utilisateur!='".$ligne [0]."' " ;
      }
     $resultats = SQL_commande ($requete, $id_sql) ;
     $nbr = SQL_nbr_lignes ($resultats) ;
     If ($nbr > 0)
      {
       $requete = "INSERT INTO tromb_utilisateurs (type,id_utilisateur,id,nom,prenoms,photo_originale,photo_traitee,date,heure_debut,heure_fin,traitee,vignette,deplacee,activation) VALUES " ;
       For ($i = 0 ; $i < $nbr ; $i++)
        {
         $ligne = SQL_tableau_associatif ($resultats) ;
         If ($i > 0) { $requete .= "," ; }
         $requete .= "('1','".$ligne ["id_utilisateur"]."','".$ligne ["droits"]."','".Str_Replace ("'", "\'", $ligne ["nom"])."','".Str_Replace ("'", "\'", $ligne ["prenom"])."','','".$ligne ["photo"]."','0000-00-00','00:00:00','00:00:00','0','0','0','0')" ;
        }
       $resultats = SQL_commande ($requete, $id_sql) ;
      }
    }
   // Mise a jour des noms de photos utilisateurs
   $resultats = SQL_commande ("SELECT e.id_utilisateur,e.photo FROM utilisateurs e,tromb_utilisateurs u WHERE u.id_utilisateur!='0' AND u.id_utilisateur=e.id_utilisateur and u.type='1' AND u.photo_traitee!=e.photo", $id_sql) ;
   $nbr = SQL_nbr_lignes ($resultats) ;
   If ($nbr > 0)
    {
     For ($i = 0 ; $i < $nbr ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultats) ;
       $ok = SQL_commande ("UPDATE tromb_utilisateurs SET photo_traitee='".$ligne [1]."' WHERE id_utilisateur='".$ligne [0]."' AND type='1' LIMIT 1", $id_sql) ;
      }
    }
  }
 
 /**
 * Programme principal : Initialisations
 */
 // Presence du programme de convertion : convert du package 'ImageMagick'
 $nom_prog_externe = "'convert' du paquet ImageMagick" ;
 If (File_Exists ("/usr/bin/convert")) { $prog_externe = "/usr/bin/convert" ; } Else { $prog_externe = "" ; }
?>